/**
 * @file 查询页插件
 * @desc 查询页插件
 * @author yangjiangming <449654337@qq.com>
 * @date 2019-04-28 17:43:04
 */
layui.define(['form', 'table', 'element', 'laydate', 'layer', 'zmnUtils'], function (exports) {
    var $ = layui.$;
    var form = layui.form;
    var layer = layui.layer;
    var zmnUtils = layui.zmnUtils;
    var element = layui.element;
    var table = layui.table;

    var _isFunction = zmnUtils.isFunction;
    var _modules = {};

    var CONSTANT = {
        FORM_ID: 'zmn-search-form', // 数据表格唯一标识
        TABLE_ID: 'zmn-table', // 数据表格唯一标识
        FORM_BUTTON_SEARCH_ID: 'submit-search', // 表单查询按钮唯一标识
        FORM_BUTTON_EXPORT_ID: 'submit-export', // 表单导出按钮唯一标识
        FORM_BUTTON_RESET_ID: 'submit-reset', // 表单重置按钮唯一标识
        ORDER_ASC: 1, // 排序升序
        ORDER_DESC: 2, // 排序降序
    };

    /**
     * 初始化页面所有需要使用 Select2 的下拉框
     */
    function _initAllRemoteSelectBySelect2 (page) {
        page.config.initSelect2();
    }

    /**
     * 初始化清除按钮点击事件
     * @param page
     * @private
     */
    function _initClickEventOfCleanButton (page) {
        form.on('submit(' + page.config.resetBtn + ')', function (obj) {
            if (page.config.resetHandler(obj) !== false) {
                setTimeout(function () {
                    $('input:not([type="checkbox"][lay-filter="datepicker"])').val('');
                    $('select').val('');

                    var $multiSlectList = $('select[xm-select]');
                    $multiSlectList.each(function () {
                        var xmSelect = $(this).attr('xm-select');
                        layui.formSelects.value(xmSelect, []);
                    });

                    _initAllRemoteSelectBySelect2(page);
                    form.render('select');
                }, 100);
            }

            return false;
        });
    }

    /**
     * 初始化导出事件
     * @param page
     * @private
     */
    function _initExportEvent (page) {
        // 监听查询表单导出事件
        form.on('submit(' + page.config.exportBtn + ')', function (obj) {
            if (!page.config.export) {
                layer.msg('当前页不支持导出');
                return false;
            }

            if (!page.config.exportURL) {
                layer.msg('请添加导出 URL');
                return false;
            }

            var params = page.config.parseParams(obj);

            if (!Object.keys(params).length) {
                layer.msg('请至少选择一个查询条件');
                return false;
            }

            if (page.config.exportHandler(obj) !== false) {
                layer.tips(`至多导出 ${ page.config.export.count } 条`, obj.elem, {
                    success: function () {
                        page.export(params);
                    }
                });
            }

            return false;
        });
    }

    function _initSearchEvent (page) {
        var config = page.config;
        form.on('submit(' + config.searchBtn + ')', function (obj) {
            var params = config.parseParams(obj);

            if (!Object.keys(params).length) {
                layer.msg('请至少选择一个查询条件');
                return false;
            }

            if (config.searchHandler(obj, params) !== false) {
                page.search(params);
            }

            return false;
        });
    }

    /**
     * 保存模块
     * @param name
     * @param mod
     * @private
     */
    function _saveModules (name, mod) {
        _modules[name] = mod;
    }

    /**
     * 加载模块
     * @param name
     * @param callback
     * @private
     */
    function _loadModule (name, callback) {
        layui.use(name, function (mod) {
            if (_isFunction(callback)) {
                _saveModules(name, mod);
                callback(mod);
            }
        });
    };

    /**
     * Page 插件构造函数
     * @param config 插件配置
     * @param tableConfig 数据表格配置
     * @constructor
     */
    function Page (config, tableConfig) {
        this.config = Object.assign({}, this.config, config);

        var tableID = this.config.id;

        this.tableConfig = Object.assign({}, {
            id: tableID,
            url: this.config.searchURL,
            elem: '#' + tableID,
            cols: table.getConfig(tableID).cols,
        }, this.tableConfig, this.config.tableConfig);

        this.init();
    }

    /**
     * 插件配置
     */
    Page.prototype.config = {
        id: CONSTANT.TABLE_ID,
        formId: CONSTANT.FORM_ID,
        searchBtn: CONSTANT.FORM_BUTTON_SEARCH_ID,
        exportBtn: CONSTANT.FORM_BUTTON_EXPORT_ID,
        resetBtn: CONSTANT.FORM_BUTTON_RESET_ID,
        searchURL: '',
        exportURL: '',
        rowUpdateURL: '',
        defaultParams: null, // 默认查询条件，如果有则会进行默认查询
        multiSelect: false,
        tableConfig: {},
        orderObj: {}, // 排序字段
        export: { // 导出配置
            count: 5000,
        },
        exportFunc: function (exportURL, params) {
            zmnUtils.exportFile(exportURL, params);
        },
        // 整理表格查询参数
        parseParams: function (dataObj) {
            return dataObj.field;
        },
        event: function () { },
        init: function () { },
        initSelect2: function () {},
        rowDoubleHandler: function (rowObj) { },
        toolbarHandler: function (obj) { },
        toolHandler: function (obj) { },
        searchHandler: function (obj, params) {},
        exportHandler: function (obj) {},
        resetHandler: function (obj) {}
    };

    /**
     * 数据表格配置
     */
    Page.prototype.tableConfig = {
        method: 'POST',
        contentType: 'application/json;charset=utf-8',
        loading: true,
        page: true,
        autoSort: false,
        limit: 100,
        limits: [100],
        data: null,
        where: {},
        request: {
            pageName: 'pageIndex', // 页码
            limitName: 'pageSize' // 条数限制
        },
        response: { statusCode: 200 },
        initSort: {},
        parseData: function (res) {
            var count = res.data ?  res.data.count : 0;
            $('.layui-this').find('.count').text('（共 ' + count + ' 条）');

            return {
                "code": res.status,
                "msg": res.message,
                "count": res.data ? (res.data.count > 10000 ? 10000 : res.data.count) : 0,
                "data": res.data ? res.data.data : []
            };
        },
        done: function (res, curr, count) {}
    };

    /**
     * 缓存
     * @type {{params: {}, modules: {}}}
     */
    Page.prototype.cache = {
        params: {},
        modules: _modules
    };

    /**
     * 懒加载
     */
    Page.prototype.lazyLoad = function () {
        var config = this.config;

        if (config.multiSelect) {
            _loadModule('formSelects');
        }
    };

    /**
     * 页面初始化入口
     */
    Page.prototype.init = function () {
        this.initPage();
        this.initEvent();
        $('body').append('<div class="page-loaded"></div>');
    };

    /**
     * 初始化页面
     */
    Page.prototype.initPage = function () {
        if (_isFunction(this.config.init)) {
            this.config.init();
        }

        if (_isFunction(this.config.initSelect2)) {
            this.config.initSelect2();
        }

        if (this.config.defaultParams) {
            this.search(this.config.defaultParams);
        }
    };

    /**
     * 初始化页面事件
     */
    Page.prototype.initEvent = function () {
        var that = this;
        var id = that.config.id;

        if (_isFunction(this.config.event)) {
            this.config.event();
        }

        _initClickEventOfCleanButton(that);

        _initExportEvent(that);

        // 监听查询表单提交事件
        _initSearchEvent(that);

        // 监听时间选择器控制选择框点击事件
        form.on('checkbox(datepicker)', function (data) {
            var $dataPicker = $('.date-picker-item').eq(data.value);
            if (data.elem.checked) {
                $dataPicker.addClass('inline-block');
            } else {
                $dataPicker.removeClass('inline-block');
            }

            form.render();
        });

        // tab 查询
        element.on('tab(searchTab)', function (obj) {
            var type = $(this).data('type');

            if (type === -1) {
                return;
            }

            that.search({ tabType: type });
        });

        // 监听数据表格排序事件
        table.on('sort(' + id + ')', function (obj) {
            that.sortSearch(obj);
        });

        // 监听数据行双击事件
        table.on('rowDouble(' + id + ')', function (rowObj) {
            that.config.rowDoubleHandler(rowObj);
        });

        // 监听头工具栏事件
        table.on('toolbar(' + id + ')', function (obj) {
            that.config.toolbarHandler(obj);
        });

        // 监听工具栏事件
        table.on('tool(' + id + ')', function (obj) {
            that.config.toolHandler(obj);
        });
    };

    /**
     * 查询
     * @param params
     * @param data
     */
    Page.prototype.search = function (params, data) {
        var config = this.config;
        var where = { where: $.extend({}, config.orderObj,  params) };
        var tableConfig = $.extend({}, this.tableConfig,  where, {
            data: data || null
        });
        table.render(tableConfig);
    };

    /**
     * 排序查询
     * @param obj 排序字段
     */
    Page.prototype.sortSearch =  function (obj) {
        table.reload(this.config.id, {
            initSort: obj,
            where: {
                orderField: obj.field,
                defaultOrder: obj.type === 'asc' ? CONSTANT.ORDER_ASC : CONSTANT.ORDER_DESC
            },
            page: {
                curr: 1
            }
        });
    };

    /**
     * 导出
     * @param params 数据导出
     */
    Page.prototype.export = function (params) {
        var that = this;
        var config = that.config;
        setTimeout(function () {
            config.exportFunc(config.exportURL, params);
        }, 300);
    };

    /**
     * 打印
     * @type {{}}
     */
    Page.prototype.print = {

    };

    /**
     * 初始化
     * @param config
     * @returns {Page}
     * @private
     */
    function _init (config) {
        return new Page(config);
    }

    exports('searchPage', {
        init: _init
    });
});